#include "ModificacionMovimiento.h"
#include "ui_ModificacionMovimiento.h"

extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel  *movimientos_model;
extern QTableView *movimientos_view;
extern QLineEdit *saldo_line1;

/*
 * Constructor de la clase ModificacionMovimiento.
 */
ModificacionMovimiento::ModificacionMovimiento(QWidget *parent) :
    QWidget(parent),
    mov_model(new QSqlRelationalTableModel(this)),
    ui(new Ui::ModificacionMovimiento)
{
    ui->setupUi(this);

    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);

    mov_model->setTable("movimiento");

    ui->fecha_mov->setFocus();

    CargarPersonas();
    CargarConceptos();

    connect(ui->save_btn,SIGNAL(clicked()),this,SLOT(SaveButton()));
    connect(ui->cancel_btn,SIGNAL(clicked()),this,SLOT(CancelButton()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(SaveButton()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

/*
 * Destructor de la clase ModificacionMovimiento.
 */
ModificacionMovimiento::~ModificacionMovimiento()
{
    delete ui;
}

/**
 * @brief CargarPersonas
 * Carga personas en el combobox
 */
void ModificacionMovimiento::CargarPersonas()
{
    // Carga las personas de la pabla persona
    QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
    QString stm2= "select persona from persona where estado is null or estado <> 'BAJA' order by persona";

    if (! query2->exec(stm2)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, "
                              "intentelo manualmente || " + query2->lastError().text());
        return;
    }
    ui->comboBox_Persona_2->addItem("");
    while (query2->next()) {
        ui->comboBox_Persona_2->addItem(query2->value(query2->record().indexOf("persona")).toString());
    }
}

/**
 * @brief AltaCheque::CargarConceptos
 * Carga conceptos en el combobox
 */
void ModificacionMovimiento::CargarConceptos()
{
    // Carga las personas de la pabla cliente
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select concepto from concepto order by concepto";

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros de conceptos, "
                              "intentelo nuevamente || " + query->lastError().text());
        return;
    }
    ui->comboBox_concepto_2->addItem("");
    while (query->next()) {
        ui->comboBox_concepto_2->addItem(query->value(query->record().indexOf("concepto")).toString());
    }
}

/*
 * Obtiene la información del movimiento elegido desde el modulo
 */
void ModificacionMovimiento::GetMovimientoInfo(int i)
{
    row = i;
    ui->fecha_mov->setDate(movimientos_model->index(i, 1).data().toDate());
    ui->comboBox_Persona_2->setCurrentText(movimientos_model->index(i, 2).data().toString());
    ui->comboBox_concepto_2->setCurrentText(movimientos_model->index(i, 3).data().toString());
    ui->comboBox_moneda_2->setCurrentText(movimientos_model->index(i, 4).data().toString());
    ui->idMoneda->setText(movimientos_model->index(i, 5).data().toString());
    ui->debe_3->setText(movimientos_model->index(i, 6).data().toString());
    ui->haber_2->setText(movimientos_model->index(i, 7).data().toString());
}

/*
 * Guarda los cambios efectuados en el movimiento.
 */
void ModificacionMovimiento::SaveButton()
{
    QString moneda = movimientos_model->index(row, 4).data().toString();
    QString idMoneda = movimientos_model->index(row, 7).data().toString();

    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar Movimiento"),
                                   "¿Está seguro que quiere guardar los cambios?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        if (moneda == "Cheque") {
            QMessageBox::critical(this,"Error!", tr("No se puede editar el movimiento porque está asociado al Cheque Nro.: '%1'."),
                                  tr("Por favor realice las acciones correspondientes desde el Módulo Cheques.").arg(idMoneda));
            return;
        } else {
            QString filter = "id_mov = '" + movimientos_model->index(row, 0).data().toString() + "'";
            movimientos_model->setFilter(filter);
            enjoylifedb.transaction();
            if (!(movimientos_model->select())) {
                QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            if (movimientos_model->rowCount() == 1) {
                QSqlRecord record = movimientos_model->record(0);

                record.setValue("fecha_mov", ui->fecha_mov->text());

                if (ui->comboBox_Persona_2->itemText(ui->comboBox_Persona_2->currentIndex()).isEmpty()) {
                    QMessageBox::warning(this,"Advertencia!", "El campo Persona no puede ser vacío");
                    return;
                } else
                    record.setValue("m_persona", ui->comboBox_Persona_2->itemText(ui->comboBox_Persona_2->currentIndex()));

                if (ui->comboBox_concepto_2->itemText(ui->comboBox_concepto_2->currentIndex()).isEmpty()) {
                    QMessageBox::warning(this,"Advertencia!", "El campo Concepto no puede ser vacío");
                    return;
                } else
                    record.setValue("m_concepto", ui->comboBox_concepto_2->itemText(ui->comboBox_concepto_2->currentIndex()));

                if (ui->comboBox_moneda_2->itemText(ui->comboBox_moneda_2->currentIndex()).isEmpty()) {
                    QMessageBox::warning(this,"Advertencia!", "El campo Moneda no puede ser vacío");
                    return;
                } else
                    record.setValue("tipo_moneda", ui->comboBox_moneda_2->itemText(ui->comboBox_moneda_2->currentIndex()));

                if (ui->comboBox_moneda_2->itemText(ui->comboBox_moneda_2->currentIndex()) == "Cheque") {
                    QMessageBox::information(this,"Aviso!", "Para cargar un cheque hagalo dese el Módulo Cheques.");
                    return;
                }

                if ((ui->comboBox_moneda_2->currentIndex() == 3) || (ui->comboBox_moneda_2->currentIndex() == 4)) {
                    if (ui->idMoneda->text().isEmpty()) {
                        QMessageBox::information(this,"Aviso!", "Por favor ingrese el número de transacción bancaria.");
                        return;
                    } else
                        record.setValue("idMoneda", ui->idMoneda->text());
                }

                if (ui->debe_3->text().isEmpty()) {
                    QMessageBox::warning(this,"Advertencia!", "El campo Debe no puede ser vacío");
                    return;
                } else
                    record.setValue("debe", ui->debe_3->text());

                if (ui->haber_2->text().isEmpty()) {
                    QMessageBox::warning(this,"Advertencia!", "El campo Haber no puede ser vacío");
                    return;
                } else
                    record.setValue("haber", ui->haber_2->text());

                QString idCtaCte = movimientos_model->index(row, 8).data().toString();
                if (!idCtaCte.isEmpty()) {
                    QMessageBox::warning(this,"Advertencia!", tr("Está intentando modificar un movimiento asociado a la Cta. Cte. '%1'"),
                                         tr("Realice las acciones correspondientes desde el Módulo \"Cuenta Corriente\"").arg(idCtaCte));
                    return;
                }

                movimientos_model->setRecord(0, record);
                enjoylifedb.transaction();
                if (!mov_model->submitAll()) {
                    QString error = mov_model->lastError().text();
                    QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                            "\n %1").arg(error));
                    enjoylifedb.rollback();
                    return;
                }
                enjoylifedb.commit();
            }
            else {
                QMessageBox::critical(this,"Error!", tr("No se pudo recuperar los datos del movimiento, intentelo de nuevo."));
                enjoylifedb.rollback();
            }
        }
    }
    else
        return;

    UpdateMovimientosList();
    CorrectViewOfModel();
    CalcularSaldoMensual();
    close();
}

/*
 * Cancela la modificación del movimiento.
 */
void ModificacionMovimiento::CancelButton()
{
    enjoylifedb.transaction();
    if (!(movimientos_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    hide();
    close();
}

/*
 * Acción del boton: Actualiza la lista de moviemientos.
 */
void ModificacionMovimiento::UpdateMovimientosList()
{
    QDate date;
    date.setDate(date.currentDate().year(),date.currentDate().month(),date.currentDate().day());
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio, mes;
    anio = date.toString(formatYear);
    mes = date.toString(formatMonth);

    QString filtroMov;
    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
    filtroMov = filtroMov + " and date_part('month', fecha_mov) <= '" + mes + "'";
    enjoylifedb.transaction();
    movimientos_model->setTable("movimiento");
    movimientos_model->filter().clear();
    movimientos_model->setFilter(filtroMov);
    if (!(movimientos_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
//    saldo_line2->setText("0.00");
    CorrectViewOfModel();
    CalcularSaldoMensual();
}

/*
 * Acomoda la vista del modulo Movimientos.
 */
void ModificacionMovimiento::CorrectViewOfModel()
{
    movimientos_model->setHeaderData(1,Qt::Horizontal,"Fecha");
    movimientos_model->setHeaderData(2,Qt::Horizontal,"Persona");
    movimientos_model->setHeaderData(3,Qt::Horizontal,"Concepto");
    movimientos_model->setHeaderData(4,Qt::Horizontal,"Tipo Moneda");
    movimientos_model->setHeaderData(6,Qt::Horizontal,"Cobro");
    movimientos_model->setHeaderData(7,Qt::Horizontal,"Pago");

    movimientos_view->setModel(movimientos_model);
    movimientos_view->setCornerButtonEnabled(true);
    movimientos_view->setAlternatingRowColors(true);
    movimientos_view->setGridStyle(Qt::SolidLine);
    movimientos_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    movimientos_view->setWordWrap(true);
    movimientos_view->sortByColumn(1,Qt::SortOrder());
    movimientos_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    movimientos_view->hideColumn(0);
    movimientos_view->hideColumn(5);
    movimientos_view->hideColumn(8);
    movimientos_view->scrollToBottom();
}

/*
 * Calcula el saldo mensual cada ve q se modifica algun registro.
 */
void ModificacionMovimiento::CalcularSaldoMensual()
{
//    QDate date;
//    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
//    QString formatYear = "yyyy";
//    QString formatMonth = "MM";
//    QString anio, mes;
//    anio = date.toString(formatYear);
//    mes = date.toString(formatMonth);
//    QString filtroMov;
//    filtroMov = "date_part('year', fecha_mov) <= '" + anio + "'";
//    filtroMov = filtroMov + " and date_part('month', fecha_mov) <= '" + mes + "'";

    enjoylifedb.transaction();
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select sum(debe) as sumDebe, sum(haber) as sumHaber from movimiento "; /*where " + filtroMov;*/
    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudo recuperar los datos necesarios para calcular el saldo actual, "
                              "intentelo nuevamente || " + query->lastError().text());
        enjoylifedb.rollback();
        return;
    }

    double sumDebe, sumHaber;
    while (query->next()) {
        if (query->last()) {
            sumDebe = query->value(query->record().indexOf("sumDebe")).toDouble();
            sumHaber = query->value(query->record().indexOf("sumHaber")).toDouble();
        }
    }
    QVariant val = sumDebe - sumHaber;
    const int precision = 2;
    saldo_line1->setText(QString("%1").arg(val.toDouble(), 0, 'f', precision));

    enjoylifedb.commit();
}
